%% Definition of M3UA message

%% M3UA message class
-define(ht_m3ua_mgmt,0).
-define(ht_m3ua_transfer,1).
-define(ht_m3ua_ssnm,2).
-define(ht_m3ua_aspsm,3).
-define(ht_m3ua_asptm,4).
-define(ht_m3ua_rkm,9).

%% M3UA MGMT message
-define(ht_m3ua_err,0).
-define(ht_m3ua_ntfy,1).

%% M3UA Transfer message
-define(ht_m3ua_data,1).

%% M3UA SSNM Message
-define(ht_m3ua_duna,1).
-define(ht_m3ua_dava,2).
-define(ht_m3ua_daud,3).
-define(ht_m3ua_scon,4).
-define(ht_m3ua_dupu,5).
-define(ht_m3ua_drst,6).

%% M3UA ASPSM Message
-define(ht_m3ua_aspup,1).
-define(ht_m3ua_aspdn,2).
-define(ht_m3ua_beat,3).
-define(ht_m3ua_aspup_ack,4).
-define(ht_m3ua_aspdn_ack,5).
-define(ht_m3ua_beat_ack,6).

%% M3UA ASPTM Message
-define(ht_m3ua_aspac,1).
-define(ht_m3ua_aspinac,2).
-define(ht_m3ua_aspac_ack,3).
-define(ht_m3ua_aspinac_ack,4).

%% M3UA RKM Message
-define(ht_m3ua_reg_req,1).
-define(ht_m3ua_reg_rsp,2).
-define(ht_m3ua_dereg_req,3).
-define(ht_m3ua_dereg_rsp,4).

%% M3UA common parameter tag
-define(ht_m3ua_info_string_tag,16#0004).
-define(ht_m3ua_routing_context_tag,16#0006).
-define(ht_m3ua_diagnostic_info_tag,16#0007).
-define(ht_m3ua_heatbeat_data_tag,16#0009).
-define(ht_m3ua_traffic_mode_tag,16#000b).
-define(ht_m3ua_error_code_tag,16#000c).
-define(ht_m3ua_status_tag,16#000d).
-define(ht_m3ua_asp_id_tag,16#0011).
-define(ht_m3ua_affected_pc_tag,16#0012).
-define(ht_m3ua_correlation_id_tag,16#0013).

%% M3UA specific parameter tag
-define(ht_m3ua_network_appearance_tag,16#0200).
-define(ht_m3ua_user_cause_tag,16#0204).
-define(ht_m3ua_congestion_ind_tag,16#0205).
-define(ht_m3ua_concerned_dest_tag,16#0206).
-define(ht_m3ua_routing_key_tag,16#0207).
-define(ht_m3ua_reg_result_tag,16#0208).
-define(ht_m3ua_dereg_result_tag,16#0209).
-define(ht_m3ua_local_rk_id_tag,16#020a).
-define(ht_m3ua_dpc_tag,16#020b).
-define(ht_m3ua_si_tag,16#020c).
-define(ht_m3ua_opc_list_tag,16#020e).
-define(ht_m3ua_protocol_data_tag,16#0210).
-define(ht_m3ua_reg_status_tag,16#0212).
-define(ht_m3ua_dereg_status_tag,16#0213).

%% Trafic mode macro
-define(asp_mode_override,1).
-define(asp_mode_loadshare,2).
-define(asp_mode_broadcast,3).


-record(ht_m3ua_proto_data,{
	opc		:: non_neg_integer(),	%% M
	dpc		:: non_neg_integer(),	%% M
	si		:: byte(),		%% M
	ni		:: byte(),		%% M
	mp		:: byte(),		%% M
	sls		:: byte(),		%% M
	data	:: binary()		%% M
}).

-record(ht_m3ua_transfer_data,{
	network_appearance	:: non_neg_integer(),		%% O
	routing_context		:: non_neg_integer(),		%% C
	protocol_data		:: #ht_m3ua_proto_data{},	%% M
	correlation_id		:: non_neg_integer()		%% O
}).

%% ASP state machine management message
-record(ht_m3ua_aspsm_aspup,{
	asp_id		:: non_neg_integer(),				%% O
	info_string	:: string()							%% O
}).

-record(ht_m3ua_aspsm_aspup_ack,{
	asp_id		:: non_neg_integer(),				%% O
	info_string	:: string()							%% O
}).

-record(ht_m3ua_aspsm_aspdown,{
	info_string	:: string()							%% O
}).

-record(ht_m3ua_aspsm_aspdown_ack,{
	info_string	:: string()							%% O
}).

%% ASP TM message
-record(ht_m3ua_asptm_aspac,{
	traffic_mode		:: non_neg_integer(),		%% O
	routing_context		:: list(),					%% O
	info_string	:: string()							%% O
}).

-record(ht_m3ua_asptm_aspac_ack,{
	traffic_mode		:: non_neg_integer(),		%% O
	routing_context		:: list(),					%% O
	info_string	:: string()							%% O
}).

-record(ht_m3ua_msg,{
	version	:: byte(),		%% M
	reserved = 0 ::byte(),	%% M
	msg_class ::byte(),		%% M
	msg_type	::byte(),	%% M
	msg_body	:: any()	%% M
}).